// Warning : If you need to use this file, include Util_utils_types.h
namespace Util
{
    // Util's version of std::make_pair.
    // This function automatically converts PODs to Util's types,
    // so writing :
    //      MakePair(1, 1u)
    // ... creates a Pair<Int, UInt> rather than a Pair<int, uint>, and :
    //      MakePair(1, "bla")
    // ... creates a Pair<Int, Str> rather than throwing a compiler error,
    // as std::make_pair does if your implementation is standard compliant.
    // See : http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#181

    template<class T, class N>
    Pair<typename TypeTraits<T>::UtilType, typename TypeTraits<N>::UtilType> MakePair(const T& mFirst, const N& mSecond)
    {
        return Pair<typename TypeTraits<T>::UtilType, typename TypeTraits<N>::UtilType>(mFirst, mSecond);
    }

    template<class N>
    Pair<StrType<char>, typename TypeTraits<N>::UtilType> MakePair(const char* mFirst, const N& mSecond)
    {
        return Pair<StrType<char>, typename TypeTraits<N>::UtilType>(mFirst, mSecond);
    }

    template<class T>
    Pair< typename TypeTraits<T>::UtilType, StrType<char> > MakePair(const T& mFirst, const char* mSecond)
    {
        return Pair< typename TypeTraits<T>::UtilType, StrType<char> >(mFirst, mSecond);
    }
}
